/*
 *    Copyright (c) 2017 ADTEC
 *    All rights reserved
 *
 *    本程序为自由软件；您可依据自由软件基金会所发表的GNU通用公共授权条款规定，就本程序再为发布与／或修改；无论您依据的是本授权的第二版或（您自行选择的）任一日后发行的版本。
 *    本程序是基于使用目的而加以发布，然而不负任何担保责任；亦无对适售性或特定目的适用性所为的默示性担保。详情请参照GNU通用公共授权。
 */

package com.nxy.cpfsfe;

import com.adtec.starring.log.TrcLog;
import com.adtec.starring.util.StringTool;

/**
 * <p>Logable</p>
 * <p>private static final String LOG_FILE = _getAutoLogName();</p>
 * <p>@Override</p>
 * <p>protected String getLogName() { return LOG_FILE;}</p>
 * <p>Copyright: Copyright (c) 2017</p> 
 * <p>Company: 北京先进数通信息技术股份公司</p> 
 * @author  李泽阳
 * @version 1.0 2018年4月9日 李泽阳
 * <p>          修改者姓名 修改内容说明</p>
 * @see     参考类1
 */
public abstract class Logable {
    protected static String _getAutoLogName() {
        Exception ex = new Exception();
        String curCls = null;
        for (StackTraceElement elem : ex.getStackTrace()) {
            if(elem == null) continue;
            String className = elem.getClassName();
            if (StringTool.isNullOrEmpty(curCls)) {
                curCls = className;
            } else if (!curCls.equals(className)) {
                int index = className.lastIndexOf('.') + 1;
                if (index >= className.length()
                        || className.length() == 0)
                    continue;
                return className.substring(index) + ".log";
            }
        }
        return "_temp.log";
    }

    protected static void _log(String fmt, Object... argv) {
        TrcLog.log(_getAutoLogName(), fmt, argv);
    }

    protected static void _info(String fmt, Object... argv) {
        TrcLog.info(_getAutoLogName(), fmt, argv);
    }

    protected static void _warn(String fmt, Object... argv) {
        TrcLog.warn(_getAutoLogName(), fmt, argv);
    }

    protected static void _error(String fmt, Object... argv) {
        TrcLog.error(_getAutoLogName(), fmt, argv);
    }

    protected static void _error(Throwable e) {
        TrcLog.error(_getAutoLogName(), _getStackTrace(e));
    }
    
    /**
     * 获取异常堆栈信息字符串
     * @param throwable 异常，例如：Exception
     * @return 异常堆栈信息
     */
    public static String _getStackTrace(Throwable throwable) {
        StringBuffer buffer = new StringBuffer();
        buffer.append(throwable.getClass().getName());
        buffer.append(": ");
        buffer.append(throwable.getMessage());
        buffer.append('\n');
        for (StackTraceElement stackTraceElement : throwable.getStackTrace()) {
            buffer.append("\tat ");
            buffer.append(stackTraceElement.toString());
            buffer.append('\n');
        }
        if(throwable.getCause() != null)
            buffer.append(_getStackTrace(throwable.getCause()));
        return buffer.toString();
    }
    
    /**
     * 重写该方法可以更快获取日志名称，重写示例：<p>
     *  private static final String LOG_NAME = _getAutoLogName();</p>
     *  <p>@Override</p><p>
     *  protected String getLogName() {
     *      return LOG_NAME;
     *  }</p>
     * @return 日志文件名
     */
    protected String getLogName() {
        return _getAutoLogName();
    }

    protected void log(String fmt, Object... argv) {
        this.log(0, fmt, argv);
    }

    protected void info(String fmt, Object... argv) {
        this.info(0, fmt, argv);
    }

    protected void warn(String fmt, Object... argv) {
        this.warn(0, fmt, argv);
    }

    protected void error(String fmt, Object... argv) {
        this.error(0, fmt, argv);
    }

    protected void error(Throwable e) {
        this.error(0, e);
    }

    protected void log(int index, String fmt, Object... argv) {
        TrcLog.log(getLogName(), String.format("%d]\n%s\n[log", index, fmt), argv);
    }

    protected void info(int index, String fmt, Object... argv) {
        TrcLog.info(getLogName(), String.format("%d]\n%s\n[log", index, fmt), argv);
    }

    protected void warn(int index, String fmt, Object... argv) {
        TrcLog.warn(getLogName(), String.format("%d]\n%s\n[log", index, fmt), argv);
    }

    protected void error(int index ,String fmt, Object... argv) {
        TrcLog.error(getLogName(), String.format("%d]\n%s\n[log", index, fmt), argv);
    }

    protected void error(int index, Throwable e) {
        TrcLog.error(getLogName(), "%d]\n%s\n[log", index, _getStackTrace(e));
    }
    
}
